
#pragma once

#include "atr/containers/access.hpp"
#include "atr/containers/assign.hpp"
#include "atr/containers/capacity.hpp"
#include "atr/containers/iterators.hpp"
#include "atr/containers/modifiers.hpp"
#include "atr/containers/operations.hpp"

namespace atr {

/**
 * @brief   Implements basic 'list' container
 * @details Implements basic container called 'list'. It's implemented as
 *          sequence of types with additional operations (in metaprograming
 *          style) similar in behavior to std::list. Additionally it has
 *          operation at<> implemented, as it doesn't make any other overhead.
 *
 * @tparam  class ... Types Sequence of types currently in container.
 *
 * @todo    Implement rbegin and rend eperations
 */
template <class ... Types>
struct list : public __::__access<Types...>
            , public __::__assign<list>
            , public __::__capacity<Types...>
            , public __::__iterators<list, Types...>
            , public __::__modifiers<list, Types...>
            , public __::__operations<list, Types...>
{};

} // namespace atr